home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / SWAG / SWAGA_C / COMM.SWG / 0072_Sending Strings to the Modem.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-03  |  5KB  |  131 lines

  1. {
  2. > Could anybody PLEASE tell me how I can send a string (for example
  3. > 'ATH1') to the modem? I want to create a program that dials a number
  4. > and then automaticly enters a few other numbers....
  5. > so, for example:
  6.  
  7. Without giving you a complete com-unit here's something that will do the
  8. trick.
  9. }
  10. uses crt;
  11. const
  12.   RBR     = $00;             { Receive Buffer offset               }
  13.   THR     = $00;             { Transmitter Holding offset          }
  14.   IER     = $01;             { Interrupt Enable offset             }
  15.   IIR     = $02;             { Interrupt Identification offset     }
  16.   LCR     = $03;             { Line Control offset                 }
  17.   MCR     = $04;             { Modem Control offset                }
  18.   LSR     = $05;             { Line Status offset                  }
  19.   MSR     = $06;             { Modem Status offset                 }
  20.   DLL     = $00;             { Divisor Latch Low byte              }
  21.   DLH     = $01;             { Divisor Latch Hi byte               }
  22.   CMD8259 = $20;             { Interrupt Controller Command offset }
  23.   IMR8259 = $21;             { Interrupt Controller Mask offset    }
  24.  
  25. Var Combase: Word;           { Hardware Com-port Base Adress }
  26.  
  27. Function Carrier : boolean;
  28. { To detect carrier on remote port, requires combase to be set to the  }
  29. { correct com base address                                             }
  30. begin
  31.   carrier := port[Combase + MSR] and $80 = $80;
  32. end;
  33.  
  34. Procedure RaiseDTR;
  35. { To raise the DTR signal bit 0 of the mcr must be changed to on       }
  36. begin
  37.   port[combase + msr] := port[combase + mcr] or $1;
  38. end;
  39.  
  40. Procedure LowerDTR;
  41. { To lower the DTR signal, causing carrier loss, bit 0 must be turned  }
  42. { off                                                                  }
  43. begin
  44.   port[combase + msr] := port[combase + mcr] and not $1;
  45. end;
  46.  
  47. Procedure Writeport(st : string);
  48. { This procedure takes a string from the parameters and sends each          }
  49. { character making sure that the com base address is not equal to 0 (not    }
  50. { Installed)                                                                }
  51. Var
  52.   Count,LoopLimit: word; { Time out counter }
  53.   loop: byte;
  54. Begin
  55.   LoopLimit := 2000;
  56.   for loop := 1 to length(st) do begin
  57.     Count := 0;
  58.     Repeat
  59.       inc(Count);
  60.     Until ((port[Combase + LSR] and $20) <> 0) or (Count > LoopLimit);
  61.     If Count < LoopLimit then port[Combase+THR] := byte(st[loop]);
  62.   End;
  63. End;
  64.  
  65. Procedure Hangup;
  66. { To drop carrier to hangup the phone -- Simple eh? }
  67. Begin
  68.   lowerdtr;   { Drop DTR }
  69.   delay(500);
  70.   { If the modem can't handle DTR drops go back to grade school and use }
  71.   { Hayes compatiable hangups }
  72.   if carrier then begin
  73.     writeport('+++');
  74.     delay(1000);
  75.     writeport('ATH0'#13);
  76.   End;
  77. End;
  78.  
  79. Procedure Initport(Cb : word; Baudrate : word; Bits : Byte; Parity : Char; Stop
  80. : byte);Var
  81.   tempstop,temppar: byte;
  82.   tempbaud: word;
  83. Begin
  84.   Combase := Cb;                                   { Set Comport baseadress }
  85.  
  86.   if stop = 1 then tempstop := $0                  { Decode the stopbits    }
  87.     else tempstop := $04;
  88.   case upcase(Parity) of                           { Decode parity          }
  89.     'S': tempPar := $38;
  90.     'O': tempPar := $08;
  91.     'M': tempPar := $28;
  92.     'E': tempPar := $18;
  93.     'N': tempPar := $00;
  94.   end;
  95.   case baudrate of                                 { Decode baud rate       }
  96.     110     : tempbaud := $417;
  97.     150     : tempbaud := $300;
  98.     300     : tempbaud := $180;
  99.     600     : tempbaud := $C0;
  100.     1200    : tempbaud := $60;
  101.     2400    : tempbaud := $30;
  102.     4800    : tempbaud := $18;
  103.     9600    : tempbaud := $0C;
  104.     19200   : tempbaud := $06;
  105. {   38400   : tempbaud := $03;
  106.     57600   : tempbaud := $02;
  107.     115200  : tempbaud := $01; {-- Outside of ordinal range}
  108.   End;
  109.  
  110.   port[Combase+LCR] := $80;                        { Adress Divisor Latch   }
  111.   port[Combase+DLH] := Hi(tempbaud);               { Set Baud rate          }
  112.   port[Combase+DLL] := Lo(tempbaud);
  113.   port[Combase+LCR] := $00 or temppar              { Setup Parity           }
  114.                              or (Bits - 5)         { Setup databits         }
  115.                              or tempstop;          { Setup stopbits         }
  116.   port[Combase+MCR] := $0B;                        { Set RTS, DTR           }
  117. End;
  118.  
  119. begin
  120.   initport($3F8,19200,8,'N',1);
  121.   writeport('ATD'#13);
  122. end.
  123.  
  124. {
  125. Please note that this program is well.. unable to recieve characters, if
  126. you're to poll the CTS/RTS every so often you could check it easily and
  127. you'd have a non-interrupt driven comm routine, probably end up loosing
  128. characters left & right, but it would work for what you're trying to do
  129. and save some coding. Anyhow this should get you started.
  130. }
  131.